package br.com.cs.dao.jdbc;

import br.com.cs.exception.DAOException;
import br.com.cs.dao.UsuarioDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import br.com.cs.model.Usuario;

public class UsuarioJDBC extends BaseDAOJDBC implements UsuarioDAO{
    
            private static String SQL_INSERT_USUARIO =
            "insert into USUARIO (NOME, DESCRICAO, EMAIL, MEMBRO_VISUALIZAR, MEMBRO_EDITAR, MEMBRO_CRIAR, MEMBRO_EXCLUIR, MEMBRO_RELATORIOS, VISITANTE_VISUALIZAR, VISITANTE_EDITAR, VISITANTE_CRIAR, VISITANTE_EXCLUIR, VISITANTE_RELATORIOS, TESOURARIA_VISUALIZAR, TESOURARIA_EDITAR, TESOURARIA_CRIAR, TESOURARIA_EXCLUIR, TESOURARIA_RELATORIOS, ADMINISTRACAO_VISUALIZAR, ADMINISTRACAO_EDITAR, ADMINISTRACAO_CRIAR, ADMINISTRACAO_EXCLUIR, ADMINISTRACAO_RELATORIOS) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            
            private static String SQL_UPDATE_USUARIO =
            "update usuario set usuario nome = ?, telefone = ? where id = ?";
           
            private static String SQL_DELETE_USUARIO = "delete from usuario where id = ? ";
            
            private static UsuarioJDBC instance = new UsuarioJDBC();

            
            
            
       protected UsuarioJDBC(){
      }     
      
      public static UsuarioJDBC getInstance() {
          return instance;
      } 
      
    @Override
    protected List getManyByCriteria(String sql) throws DAOException {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        List alista = new ArrayList();
        
        try {
            conn = getConnection();
            st = conn.createStatement();
            rs = st.executeQuery(sql);
            
            while (rs.next()) {
                
                
              //  boolean ativo = rs.getInt("ativo") == 1;
                
                Usuario usuario = new Usuario();
                usuario.setId(new Integer(rs.getInt("id")));
                usuario.setNome(rs.getString("nome"));
                usuario.setDescricao(rs.getString("DESCRICAO"));
                usuario.setEmail(rs.getString("EMAIL"));
                usuario.setMembroVisualizar(rs.getBoolean("MEMBRO_VISUALIZAR"));
                usuario.setMembroEditar(rs.getBoolean("MEMBRO_EDITAR"));
                usuario.setMembroCriar(rs.getBoolean("MEMBRO_CRIAR"));
                usuario.setMembroExcluir(rs.getBoolean("MEMBRO_EXCLUIR"));
                usuario.setMembroRelatorios(rs.getBoolean("MEMBRO_RELATORIOS"));
                usuario.setVisitanteVisualizar(rs.getBoolean("VISITANTE_VISUALIZAR"));
                usuario.setVisitanteEditar(rs.getBoolean("VISITANTE_EDITAR"));
                usuario.setVisitanteCriar(rs.getBoolean("VISITANTE_CRIAR"));
                usuario.setVisitanteExcluir(rs.getBoolean("VISITANTE_EXCLUIR"));
                usuario.setVisitanteRelatorios(rs.getBoolean("VISITANTE_RELATORIOS"));
                usuario.setTesourariaVisualizar(rs.getBoolean("TESOURARIA_VISUALIZAR"));
                usuario.setTesourariaEditar(rs.getBoolean("TESOURARIA_EDITAR"));
                usuario.setTesourariaCriar(rs.getBoolean("TESOURARIA_CRIAR"));
                usuario.setTesourariaExcluir(rs.getBoolean("TESOURARIA_EXCLUIR"));
                usuario.setTesourariaRelatorios(rs.getBoolean("TESOURARIA_RELATORIOS"));
                usuario.setAdministracaoVisualizar(rs.getBoolean("ADMINISTRACAO_VISUALIZAR"));
                usuario.setAdministracaoEditar(rs.getBoolean("ADMINISTRACAO_EDITAR"));
                usuario.setAdministracaoCriar(rs.getBoolean("ADMINISTRACAO_CRIAR"));
                usuario.setAdministracaoExcluir(rs.getBoolean("ADMINISTRACAO_EXCLUIR"));
                usuario.setAdministracaoRelatorios(rs.getBoolean("ADMINISTRACAO_RELATORIOS"));
                
                alista.add(usuario);
                
            }
            
            return alista;
            
        } catch (Exception e) {
            throw new DAOException("[UsuarioJDBC - getManyByCriteria] : Handled Exception  ", e);
            
        } finally {
            closeResources(conn, st, rs);
        }
    }

    @Override
    public void delete(Usuario usuario) throws br.com.cs.exception.DAOException {
        Connection conn = null;
        PreparedStatement pst = null;
        
        try {
            conn = getConnection();
            pst = conn.prepareStatement(SQL_DELETE_USUARIO);
            
            pst.setInt(1, usuario.getId().intValue());
            
            pst.executeUpdate();
            
        } catch (Exception e) {
            throw new DAOException("[UsuarioJDBC - delete] : Handled Exception  ", e);
            
        } finally {
            closeResources(conn, pst);
        }
    }

    @Override
    public List getAll() throws br.com.cs.exception.DAOException {
        String sql = "select * from USUARIO ";
        return this.getManyByCriteria(sql);
    }

    @Override
    public Usuario getByPrimaryKey(Integer id) throws br.com.cs.exception.DAOException {
        String sql = "select * from USUARIO where ID = " + id;
        List lista = this.getManyByCriteria(sql);
        if (lista != null && lista.size() > 0)
            return (Usuario) lista.get(0);
        else
            return null;
    }

    @Override
    public void save(Usuario usuario) throws br.com.cs.exception.DAOException {
        Connection conn = null;
        PreparedStatement pst = null;
        
        try {
            conn = getConnection();
            if (usuario.getId() == null) {
                System.out.println("[UsuarioJDBC] novo usuario vai ser incluido...");
                pst = conn.prepareStatement(SQL_INSERT_USUARIO);
            } else {
                System.out.println("[UsuarioDBC] usuario ja existente vai ser regravado...");
                pst = conn.prepareStatement(SQL_UPDATE_USUARIO);
                pst.setInt (24, usuario.getId().intValue());//.intValue()
            }
            
            pst.setString(1, usuario.getNome());
            pst.setString(2, usuario.getDescricao());
            pst.setString(3, usuario.getEmail());
            pst.setBoolean(4, usuario.isMembroVisualizar());
            pst.setBoolean(5, usuario.isMembroEditar());
            pst.setBoolean(6, usuario.isMembroCriar());
            pst.setBoolean(7, usuario.isMembroExcluir());
            pst.setBoolean(8, usuario.isMembroRelatorios());
            pst.setBoolean(9, usuario.isVisitanteVisualizar());
            pst.setBoolean(10, usuario.isVisitanteEditar());
            pst.setBoolean(11, usuario.isVisitanteCriar());
            pst.setBoolean(12, usuario.isVisitanteExcluir());
            pst.setBoolean(13, usuario.isVisitanteRelatorios());
            pst.setBoolean(14, usuario.isTesourariaVisualizar());
            pst.setBoolean(15, usuario.isTesourariaEditar());
            pst.setBoolean(16, usuario.isTesourariaCriar());
            pst.setBoolean(17, usuario.isTesourariaExcluir());
            pst.setBoolean(18, usuario.isTesourariaRelatorios());
            pst.setBoolean(19, usuario.isAdministracaoVisualizar());
            pst.setBoolean(20, usuario.isAdministracaoEditar());
            pst.setBoolean(21, usuario.isAdministracaoCriar());
            pst.setBoolean(22, usuario.isAdministracaoExcluir());
            pst.setBoolean(23, usuario.isAdministracaoRelatorios());
            
            //pst.setString(11, visitante.isInfMembro()?"S":"N");
            
            pst.execute();
            
        } catch (Exception e) {
            throw new DAOException("[UsuarioJDBC - save] : Handled Exception  ", e);
            
        } finally {
            closeResources(conn, pst);
        } 
    }

    @Override
    public List getByFilter(String filterName, String filterValue) throws br.com.cs.exception.DAOException{
        String sql = "select * from usuario where "+filterName+" = " + "'"+filterValue+"'";
        List lista = this.getManyByCriteria(sql);
        if (lista != null && lista.size() > 0)
            return lista;
        else{
            return null;
        }
    }
    
}